Latest Date of Dataset: 2020-04-01
Updated: 2020-04-03 01:06:17 EST

This dashboard is used to track the current progress of the COVID-19 progress throughout the world. The visualization and information presented are automatically updated daily with current data scraped from the Johns Hopkin’s COVID-19 Data Repository. Their data is retrieved for sources such as World Health Organization (WHO), China CDC, US CDC, and more.

The data is cleaned and aggregated through R, formatted in Rmarkdown, and exported as an HTML document to be hosted through GitPages. The source R notebook can be found at covid19-daily-dashboard.Rmd in the GitHub repository.

Overview of Cases (2020-04-01)

Below is an interactive plot displaying the number of confirmed, dead, and recovered cases per country and province if data is specified. The data was aggregated from the Johns Hopkins’s data repository and this notebook is set to run nightly to provide up to date results

Confirmed Cases per Country

The table below shows aggregated data of each country’s confirmed, recovered, and dead population. Each column can be sorted to view least or most of each status. The graphs below show the total and daily count of confirmed cases for the countries with the most cases and are tracked by days since the first reported case. Each graph has two seperate views - one with total count and another with % of country’s population. The population data is retrived from the United Nations.

(*China’s data is removed since dataset does not track prior to 22Jan20 therefore does not align with other countries)

COVID19 Cases Spread Timelapse

The time-lapse was produced through gganimate and shows the spread of the virus since 22Jan2020. The time-lapse cycles through the dates, showing the color coded increase of confirmed, recovered, and death cases across the world.

New Cases of the Day (2020-04-01)

The ‘New Cases of the Day’ map displays all confirmed cases of the specified date. The map was produced through Leaflet and provides a detailed and interactive map that shows the location and number of cases of the day.

Also, to differentiate if the case of the day is the first case in the specified location, it is highlighted red. All the specified points on the map are listed in the table below, including cumulative count of each location.

New Cases of the Week (2020-04-01)

The ‘New Cases of the Week’ map displays all confirmed cases of the week starting from the specified date. This map shows the same information as the daily cases map but includes all cases in the past week.

LS0tDQp0aXRsZTogIkNPVklEMTkgRGFpbHkgRGFzaGJvYXJkIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQogICAgDQotLS0NCg0KYGBge3IgU2V0dXAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIEludGVyYWN0aW9uDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShyc3R1ZGlvYXBpKQ0KbGlicmFyeShkcmF0KQ0KbGlicmFyeShnaXQycikNCg0KIyBBZ2dyZWdhdGlvbg0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCg0KIyBWaXN1YWxpemF0aW9ucw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShtYXBzKQ0KbGlicmFyeShwbmcpDQpsaWJyYXJ5KGdpZnNraSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShwYWxzKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbGluayA8LSAiaHR0cHM6Ly9naXRodWIuY29tLy9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS9yYXcvbWFzdGVyL2Nzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzLyINCmNzdl9saXN0IDwtIGMoDQogICJ0aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IiwNCiAgInRpbWVfc2VyaWVzX2NvdmlkMTlfZGVhdGhzX2dsb2JhbC5jc3YiLA0KICAidGltZV9zZXJpZXNfY292aWQxOV9yZWNvdmVyZWRfZ2xvYmFsLmNzdiINCikNCg0KDQpmb3IgKGNzdiBpbiBjc3ZfbGlzdCkgew0KICBwYXRoIDwtIHBhc3RlKGxpbmssIGNzdiwgc2VwID0gIiIpDQogIGRvd25sb2FkX3BhdGggPC0gcGFzdGUoImRhdGFfcmF3LyIsIGNzdiwgc2VwID0gIiIpDQogIGRvd25sb2FkLmZpbGUocGF0aCwgZGVzdGZpbGUgPSBkb3dubG9hZF9wYXRoKQ0KfQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY3ZfY29uIDwtIHJlYWRfY3N2KCJkYXRhX3Jhdy90aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IikgJT4lDQogIGdhdGhlcihrZXkgPSAiRGF0ZSIsIHZhbHVlID0gQ29uZmlybWVkLCAtTGF0LCAtTG9uZywgLWBQcm92aW5jZS9TdGF0ZWAsIC1gQ291bnRyeS9SZWdpb25gKQ0KDQpjdl9kZWQgPC0gcmVhZF9jc3YoImRhdGFfcmF3L3RpbWVfc2VyaWVzX2NvdmlkMTlfZGVhdGhzX2dsb2JhbC5jc3YiKSAlPiUNCiAgZ2F0aGVyKGtleSA9ICJEYXRlIiwgdmFsdWUgPSBEZWFkLCAtTGF0LCAtTG9uZywgLWBQcm92aW5jZS9TdGF0ZWAsIC1gQ291bnRyeS9SZWdpb25gKQ0KDQpjdl9yZWMgPC0gcmVhZF9jc3YoImRhdGFfcmF3L3RpbWVfc2VyaWVzX2NvdmlkMTlfcmVjb3ZlcmVkX2dsb2JhbC5jc3YiKSAlPiUNCiAgZ2F0aGVyKGtleSA9ICJEYXRlIiwgdmFsdWUgPSBSZWNvdmVyZWQsIC1MYXQsIC1Mb25nLCAtYFByb3ZpbmNlL1N0YXRlYCwgLWBDb3VudHJ5L1JlZ2lvbmApDQoNCmNvdW50cnlfcG9wIDwtIHJlYWRfY3N2KCJkYXRhX3Jhdy9jb3VudHJ5X3BvcHVsYXRpb24uY3N2IikNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY3ZfbWVyZ2UgPC0gbWVyZ2UoY3ZfY29uLCBjdl9kZWQsIGJ5ID0gYygiUHJvdmluY2UvU3RhdGUiLCAiTGF0IiwgIkxvbmciLCAiQ291bnRyeS9SZWdpb24iLCAiRGF0ZSIpLCBhbGwgPSBUUlVFKSAlPiUNCiAgbWVyZ2UoY3ZfcmVjLCBieSA9IGMoIlByb3ZpbmNlL1N0YXRlIiwgIkxhdCIsICJMb25nIiwgIkNvdW50cnkvUmVnaW9uIiwgIkRhdGUiKSwgYWxsID0gVFJVRSkgJT4lDQogIHJlbmFtZSgiQ291bnRyeV9SZWdpb24iID0gIkNvdW50cnkvUmVnaW9uIikgJT4lDQogIHJlbmFtZSgiUHJvdmluY2VfU3RhdGUiID0gIlByb3ZpbmNlL1N0YXRlIikNCmN2X21lcmdlJERhdGUgPC0gYXMuRGF0ZShjdl9tZXJnZSREYXRlLCBmb3JtYXQgPSAiJW0vJWQvJXkiKQ0KDQpjdiA8LSBnYXRoZXIoY3ZfbWVyZ2UsIGtleSA9ICJTdGF0dXMiLCB2YWx1ZSA9IENvdW50LCAtRGF0ZSwgLUxhdCwgLUxvbmcsIC1Qcm92aW5jZV9TdGF0ZSwgLUNvdW50cnlfUmVnaW9uKQ0KY3YgPC0gY3Zbd2l0aChjdiwgb3JkZXIoQ291bnRyeV9SZWdpb24sIFByb3ZpbmNlX1N0YXRlLCBTdGF0dXMsIERhdGUpKSwgXQ0KYGBgDQoNCg0KDQpgYGB7ciBmdW5jdGlvbl9jaGVja19maXJzdF9jYXNlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY2hlY2tfY29udGludW91cyA8LSBmdW5jdGlvbih4LCBjdiwgbnVtX3ByZXYpIHsNCiAgaWYgKA0KICAgIChjdiRMb25nW3hdICE9IGN2JExvbmdbeCAtIG51bV9wcmV2XSkgfHwNCiAgICAgIChjdiRMYXRbeF0gIT0gY3YkTGF0W3ggLSBudW1fcHJldl0pIHx8DQogICAgICAoY3YkU3RhdHVzW3hdICE9IGN2JFN0YXR1c1t4IC0gbnVtX3ByZXZdKSkgew0KICAgIGNvbnQgPC0gIk4iDQogIH0NCiAgZWxzZSB7DQogICAgY29udCA8LSAiWSINCiAgfQ0KICByZXR1cm4oY29udCkNCn0NCg0KDQpkYWlseV93ZWVrbHlfY291bnRlciA8LSBmdW5jdGlvbihjdikgew0KICBmb3IgKHggaW4gc2VxKDEsIG5yb3coY3YpKSkgew0KICAgIGlmICh4ID09IDEpIHsNCiAgICAgIGN2JERhaWx5X0NvdW50W3hdIDwtIE5BDQogICAgICBjdiRXZWVrbHlfQ291bnRbeF0gPC0gTkENCiAgICB9DQogICAgZWxzZSBpZiAoY2hlY2tfY29udGludW91cyh4LCBjdiwgMSkgPT0gIk4iKSB7DQogICAgICBjdiREYWlseV9Db3VudFt4XSA8LSBOQQ0KICAgICAgY3YkV2Vla2x5X0NvdW50W3hdIDwtIE5BDQogICAgfQ0KICAgIGVsc2UgaWYgKHggPD0gNykgew0KICAgICAgY3YkRGFpbHlfQ291bnRbeF0gPC0gKGN2JENvdW50W3hdKSAtIChjdiRDb3VudFt4IC0gMV0pDQogICAgICBjdiRXZWVrbHlfQ291bnRbeF0gPC0gTkENCiAgICB9DQogICAgZWxzZSBpZiAoKGNoZWNrX2NvbnRpbnVvdXMoeCwgY3YsIDEpID09ICJZIikgJiYNCiAgICAgIChjaGVja19jb250aW51b3VzKHgsIGN2LCA3KSA9PSAiTiIpKSB7DQogICAgICBjdiREYWlseV9Db3VudFt4XSA8LSAoY3YkQ291bnRbeF0pIC0gKGN2JENvdW50W3ggLSAxXSkNCiAgICAgIGN2JFdlZWtseV9Db3VudFt4XSA8LSBOQQ0KICAgIH0NCiAgICBlbHNlIGlmICgoY2hlY2tfY29udGludW91cyh4LCBjdiwgNykgPT0gIlkiKSkgew0KICAgICAgY3YkRGFpbHlfQ291bnRbeF0gPC0gKGN2JENvdW50W3hdKSAtIChjdiRDb3VudFt4IC0gMV0pDQogICAgICBjdiRXZWVrbHlfQ291bnRbeF0gPC0gKGN2JENvdW50W3hdKSAtIChjdiRDb3VudFt4IC0gN10pDQogICAgfQ0KICB9DQogIHJldHVybihjdikNCn0NCmBgYA0KDQoNCmBgYHtyLCBhcHBseV9jaGVja19jYXNlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY3YgPC0gZGFpbHlfd2Vla2x5X2NvdW50ZXIoY3YpDQpsYXRlc3RfZGF0ZSA8LSBhcy5EYXRlKFN5cy5EYXRlKCkpIC0gMQ0KI2xhdGVzdF9kYXRlIDwtIHNvcnQoY3YkRGF0ZSwgZGVjcmVhc2luZyA9IFRSVUUpWzFdIC0gMQ0KY3YgPC0gZmlsdGVyKGN2LCBEYXRlIDw9IGxhdGVzdF9kYXRlKQ0KYGBgDQoNCiMjIyMjIExhdGVzdCBEYXRlIG9mIERhdGFzZXQ6IGByIGxhdGVzdF9kYXRlYA0KIyMjIyMjIFVwZGF0ZWQ6IGByIFN5cy50aW1lKClgIEVTVA0KDQpUaGlzIGRhc2hib2FyZCBpcyB1c2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IHByb2dyZXNzIG9mIHRoZSBDT1ZJRC0xOSBwcm9ncmVzcyB0aHJvdWdob3V0IHRoZSB3b3JsZC4gVGhlIHZpc3VhbGl6YXRpb24gYW5kIGluZm9ybWF0aW9uIHByZXNlbnRlZCBhcmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGRhaWx5IHdpdGggY3VycmVudCBkYXRhIHNjcmFwZWQgZnJvbSB0aGUgW0pvaG5zIEhvcGtpbuKAmXMgQ09WSUQtMTkgRGF0YSBSZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkpLiBUaGVpciBkYXRhIGlzIHJldHJpZXZlZCBmb3Igc291cmNlcyBzdWNoIGFzIFdvcmxkIEhlYWx0aCBPcmdhbml6YXRpb24gKFdITyksIENoaW5hIENEQywgVVMgQ0RDLCBhbmQgbW9yZS4NCg0KVGhlIGRhdGEgaXMgY2xlYW5lZCBhbmQgYWdncmVnYXRlZCB0aHJvdWdoIFIsIGZvcm1hdHRlZCBpbiBSbWFya2Rvd24sIGFuZCBleHBvcnRlZCBhcyBhbiBIVE1MIGRvY3VtZW50IHRvIGJlIGhvc3RlZCB0aHJvdWdoIEdpdFBhZ2VzLiBUaGUgc291cmNlIFIgbm90ZWJvb2sgY2FuIGJlIGZvdW5kIGF0IFtjb3ZpZDE5LWRhaWx5LWRhc2hib2FyZC5SbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGJlY2hlbi9jb3ZpZDE5LWRhaWx5LWRhc2hib2FyZC9ibG9iL21hc3Rlci9jb3ZpZDE5LWRhaWx5LWRhc2hib2FyZC5SbWQpIGluIHRoZSBbR2l0SHViIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGJlY2hlbi9jb3ZpZDE5LWRhaWx5LWRhc2hib2FyZCkuDQoNCg0KYGBge3IgZW1wdHlfZGZfZnVuY3Rpb24sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQplbXB0eV9kZiA8LSBmdW5jdGlvbigpIHsNCiAgZW1wdHlfZGYgPC0gZGF0YS5mcmFtZSgNCiAgICBQcm92aW5jZV9TdGF0ZSA9IGNoYXJhY3RlcigwKSwNCiAgICBMYXQgPSBkb3VibGUoKSwgTG9uZyA9IGRvdWJsZSgpLA0KICAgIENvdW50cnlfUmVnaW9uID0gY2hhcmFjdGVyKDApLA0KICAgIERhdGUgPSBhcy5EYXRlKGNoYXJhY3RlcigpKSwNCiAgICBTdGF0dXMgPSBjaGFyYWN0ZXIoMCksDQogICAgQ291bnQgPSBkb3VibGUoKSwNCiAgICBEYWlseV9Db3VudCA9IGRvdWJsZSgpLCBXZWVrbHlfQ291bnQgPSBkb3VibGUoKQ0KICApDQogIGVtcHR5X2RmJFByb3ZpbmNlX1N0YXRlIDwtIGFzLmNoYXJhY3RlcihlbXB0eV9kZiRQcm92aW5jZV9TdGF0ZSkNCiAgZW1wdHlfZGYkQ291bnRyeV9SZWdpb24gPC0gYXMuY2hhcmFjdGVyKGVtcHR5X2RmJENvdW50cnlfUmVnaW9uKQ0KICBlbXB0eV9kZiRTdGF0dXMgPC0gYXMuY2hhcmFjdGVyKGVtcHR5X2RmJFN0YXR1cykNCiAgcmV0dXJuKGVtcHR5X2RmKQ0KfQ0KYGBgDQoNCg0KYGBge3IgbmV3X2Nhc2VzX2FnZywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmZpcnN0X2FuZF9uZXdfY2FzZXMgPC0gZnVuY3Rpb24oY3YsIGRheXMpIHsNCiAgaGlnaF9kYXRlIDwtIHNvcnQoY3YkRGF0ZSwgZGVjcmVhc2luZyA9IFRSVUUpWzFdIC0gMQ0KICBjdiA8LSBjdiAlPiUgDQogICAgZmlsdGVyKFN0YXR1cyA9PSAiQ29uZmlybWVkIiwgIWlzLm5hKENvdW50KSkNCiAgY3YkRmlyc3RfQ2FzZSA8LSBGQUxTRQ0KDQogIGZvciAoeCBpbiBzZXEoMSwgbnJvdyhjdikpKSB7DQogICAgaWYgKA0KICAgICAgKGN2JERhdGVbeF0gPT0gaGlnaF9kYXRlKSAmJg0KICAgICAgICAoY3YkQ291bnRbeCAtIGRheXNdID09IDApICYmDQogICAgICAgIChjdiRDb3VudFt4XSA+IDApDQogICAgKSB7DQogICAgICBjdiRGaXJzdF9DYXNlW3hdIDwtIFRSVUUNCiAgICB9DQogIH0NCg0KICBuZXdfY2FzZXNfZGYgPC0gZmlsdGVyKGN2LCBEYXRlID09IGhpZ2hfZGF0ZSkNCg0KICBpZiAoZGF5cyA9PSAxKSB7DQogICAgbmV3X2Nhc2VzX2RmIDwtIGZpbHRlcihuZXdfY2FzZXNfZGYsIERhaWx5X0NvdW50ID4gMCkNCiAgfQ0KICBlbHNlIGlmIChkYXlzID09IDcpIHsNCiAgICBuZXdfY2FzZXNfZGYgPC0gZmlsdGVyKG5ld19jYXNlc19kZiwgV2Vla2x5X0NvdW50ID4gMCkNCiAgfQ0KDQogIHJldHVybihuZXdfY2FzZXNfZGYpDQp9DQoNCm5ld19jYXNlc19kYXkgPC0gZmlyc3RfYW5kX25ld19jYXNlcyhjdiwgMSkNCm5ld19jYXNlc193ZWVrIDwtIGZpcnN0X2FuZF9uZXdfY2FzZXMoY3YsIDcpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmN2X2xhdGVzdCA8LSBmaWx0ZXIoY3ZfbWVyZ2UsIERhdGUgPT0gbGF0ZXN0X2RhdGUpDQpjdl9sYXRlc3QgPC0gY3ZfbGF0ZXN0W3dpdGgoY3ZfbGF0ZXN0LCBvcmRlcigtQ29uZmlybWVkLCAtUmVjb3ZlcmVkLCAtRGVhZCkpLCBdDQpgYGANCg0KIyMjIE92ZXJ2aWV3IG9mIENhc2VzIChgciBsYXRlc3RfZGF0ZWApDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSBwbG90IGRpc3BsYXlpbmcgdGhlIG51bWJlciBvZiBjb25maXJtZWQsIGRlYWQsIGFuZCByZWNvdmVyZWQgY2FzZXMgcGVyIGNvdW50cnkgYW5kIHByb3ZpbmNlIGlmIGRhdGEgaXMgc3BlY2lmaWVkLiBUaGUgZGF0YSB3YXMgYWdncmVnYXRlZCBmcm9tIHRoZSBKb2hucyBIb3BraW5zJ3MgZGF0YSByZXBvc2l0b3J5IGFuZCB0aGlzIG5vdGVib29rIGlzIHNldCB0byBydW4gbmlnaHRseSB0byBwcm92aWRlIHVwIHRvIGRhdGUgcmVzdWx0cw0KYGBge3IgZnVsbF9wbG90LCBlY2hvPUZBTFNFfQ0KY3ZfbGF0ZXN0X2xhYmVscyA8LSBmdW5jdGlvbihkZikgew0KICBsYWJzIDwtIGxhcHBseShzZXEobnJvdyhkZikpLCBmdW5jdGlvbihpKSB7DQogICAgcGFzdGUwKA0KICAgICAgIkNvdW50cnk6ICIsIGRmW2ksICJDb3VudHJ5X1JlZ2lvbiJdLCAiPGJyPiAiLA0KICAgICAgIlByb3ZpbmNlOiAiLCBkZltpLCAiUHJvdmluY2VfU3RhdGUiXSwgIjxicj4iLA0KICAgICAgIkNvbmZpcm1lZDogIiwgZGZbaSwgIkNvbmZpcm1lZCJdLCAiPGJyPiIsDQogICAgICAiRGVhZDogIiwgZGZbaSwgIkRlYWQiXSwgIjxicj4iLA0KICAgICAgIlJlY292ZXJlZDogIiwgZGZbaSwgIlJlY292ZXJlZCJdLCAiPGJyPiIsDQogICAgICAiRGF0ZTogIiwgZGZbaSwgIkRhdGUiXQ0KICAgICkNCiAgfSkNCn0NCg0KbGVhZmxldChkYXRhID0gY3ZfbGF0ZXN0LCB3aWR0aCA9ICIxMDAlIikgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgbGF0ID0gfkxhdCwNCiAgICBsbmcgPSB+TG9uZywNCiAgICByYWRpdXMgPSB+IGxvZyhDb25maXJtZWQsIDEuMSkvMTAsDQogICAgbGFiZWwgPSBsYXBwbHkoY3ZfbGF0ZXN0X2xhYmVscyhjdl9sYXRlc3QpLCBodG1sdG9vbHM6OkhUTUwpDQogICkNCmBgYA0KDQoNCiMjIyBDb25maXJtZWQgQ2FzZXMgcGVyIENvdW50cnkNClRoZSB0YWJsZSBiZWxvdyBzaG93cyBhZ2dyZWdhdGVkIGRhdGEgb2YgZWFjaCBjb3VudHJ5J3MgY29uZmlybWVkLCByZWNvdmVyZWQsIGFuZCBkZWFkIHBvcHVsYXRpb24uIEVhY2ggY29sdW1uIGNhbiBiZSBzb3J0ZWQgdG8gdmlldyBsZWFzdCBvciBtb3N0IG9mIGVhY2ggc3RhdHVzLiBUaGUgZ3JhcGhzIGJlbG93IHNob3cgdGhlIHRvdGFsIGFuZCBkYWlseSBjb3VudCBvZiBjb25maXJtZWQgY2FzZXMgZm9yIHRoZSBjb3VudHJpZXMgd2l0aCB0aGUgbW9zdCBjYXNlcyBhbmQgYXJlIHRyYWNrZWQgYnkgZGF5cyBzaW5jZSB0aGUgZmlyc3QgcmVwb3J0ZWQgY2FzZS4gRWFjaCBncmFwaCBoYXMgdHdvIHNlcGVyYXRlIHZpZXdzIC0gb25lIHdpdGggdG90YWwgY291bnQgYW5kIGFub3RoZXIgd2l0aCAlIG9mIGNvdW50cnkncyBwb3B1bGF0aW9uLiBUaGUgcG9wdWxhdGlvbiBkYXRhIGlzIHJldHJpdmVkIGZyb20gdGhlIFtVbml0ZWQgTmF0aW9uc10oaHR0cHM6Ly9wb3B1bGF0aW9uLnVuLm9yZy93cHAvRG93bmxvYWQvU3RhbmRhcmQvQ1NWLykuDQoNCg0KDQooKkNoaW5hJ3MgZGF0YSBpcyByZW1vdmVkIHNpbmNlIGRhdGFzZXQgZG9lcyBub3QgdHJhY2sgcHJpb3IgdG8gMjJKYW4yMCB0aGVyZWZvcmUgZG9lcyBub3QgYWxpZ24gd2l0aCBvdGhlciBjb3VudHJpZXMpDQoNCg0KYGBge3IgY291bnRyeV90YWJsZSwgZWNobz1GQUxTRX0NCmNvdW50cnlfdGFibGUgPC0gY3ZfbWVyZ2UgJT4lDQogIHNlbGVjdChDb3VudHJ5X1JlZ2lvbiwgQ29uZmlybWVkLCBSZWNvdmVyZWQsIERlYWQsIERhdGUpICU+JQ0KICBncm91cF9ieShDb3VudHJ5X1JlZ2lvbikgJT4lDQogIGZpbHRlcihEYXRlPT1sYXRlc3RfZGF0ZSkgJT4lDQogIHNlbGVjdChDb3VudHJ5X1JlZ2lvbiwgQ29uZmlybWVkLCBSZWNvdmVyZWQsIERlYWQpICU+JQ0KICBzdW1tYXJpc2VfYWxsKHN1bSkNCmNvdW50cnlfdGFibGUgPC0gY291bnRyeV90YWJsZVt3aXRoKGNvdW50cnlfdGFibGUsIG9yZGVyKC1Db25maXJtZWQsIC1SZWNvdmVyZWQsIC1EZWFkKSksIF0NCg0KY291bnRyeV90YWJsZQ0KYGBgDQoNCmBgYHtyIGRmX2Zvcl90b3BfY291bnRyaWVzLCBlY2hvPUZBTFNFfQ0KdG9wXzEwX2NvdW50cmllcyA8LSAoaGVhZChjb3VudHJ5X3RhYmxlJENvdW50cnlfUmVnaW9uLCAxNikpDQoNCnRvcDEwX2RmIDwtIGN2ICU+JQ0KICBmaWx0ZXIoKGN2JENvdW50cnlfUmVnaW9uICVpbiUgYyh0b3BfMTBfY291bnRyaWVzKSkgJiAoY3YkU3RhdHVzID09ICdDb25maXJtZWQnKSwgKGN2JENvdW50cnlfUmVnaW9uICE9ICdDaGluYScpKSAlPiUNCiAgc2VsZWN0KENvdW50cnlfUmVnaW9uLCBEYXRlLCBDb3VudCwgRGFpbHlfQ291bnQsIFdlZWtseV9Db3VudCkgJT4lDQogIGdyb3VwX2J5KENvdW50cnlfUmVnaW9uLCBEYXRlKSAlPiUNCiAgc3VtbWFyaXNlKENvdW50ID0gc3VtKENvdW50LCBuYS5ybSA9IFRSVUUpLCBEYWlseV9Db3VudCA9IHN1bShEYWlseV9Db3VudCwgbmEucm0gPSBUUlVFKSwgV2Vla2x5X0NvdW50ID0gc3VtKFdlZWtseV9Db3VudCwgbmEucm0gPSBUUlVFKSkNCg0KDQp0b3AxMF9kZiA8LSB0b3AxMF9kZlt3aXRoKHRvcDEwX2RmLCBvcmRlcihDb3VudHJ5X1JlZ2lvbiwgRGF0ZSkpLCBdDQp0b3AxMF9kZiRgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCA8LSAwDQoNCmZvciAoeCBpbiBzZXEoMiwgbnJvdyh0b3AxMF9kZikpKSB7DQogIGlmICgodG9wMTBfZGYkQ291bnRyeV9SZWdpb25beF0gPT0gdG9wMTBfZGYkQ291bnRyeV9SZWdpb25beC0xXSkgJiAodG9wMTBfZGYkQ291bnRbeF0gPj0gMjUpKSB7DQogICAgaWYgKHRvcDEwX2RmJGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgW3gtMV0gPT0gMCl7DQogICAgICBpZiAodG9wMTBfZGYkRGFpbHlfQ291bnRbeF0gPiAwKSB7DQogICAgICAgIHRvcDEwX2RmJGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgW3hdIDwtIDENCiAgICAgIH0NCiAgICB9DQogICAgZWxzZSB7DQogICAgICBpbnRlcnZhbCA8LSB0b3AxMF9kZiRgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYFt4LTFdDQogICAgICB0b3AxMF9kZiRgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYFt4XSA8LSAxICsgaW50ZXJ2YWwNCiAgICB9DQogIH0NCn0NCg0KDQp0b3AxMF9kZiA8LSBtZXJnZSh0b3AxMF9kZixjb3VudHJ5X3BvcCxieT1jKCdDb3VudHJ5X1JlZ2lvbicsJ0NvdW50cnlfUmVnaW9uJykpDQp0b3AxMF9kZiRQX0NvdW50IDwtIHRvcDEwX2RmJENvdW50IC8gdG9wMTBfZGYkUG9wdWxhdGlvbg0KdG9wMTBfZGYkUF9EYWlseV9Db3VudCA8LSB0b3AxMF9kZiREYWlseV9Db3VudCAvIHRvcDEwX2RmJFBvcHVsYXRpb24NCnRvcDEwX2RmJFBfV2Vla2x5X0NvdW50IDwtIHRvcDEwX2RmJFdlZWtseV9Db3VudCAvIHRvcDEwX2RmJFBvcHVsYXRpb24NCnRvcDEwX2RmIDwtIHRvcDEwX2RmICU+JSBzZWxlY3QoQ291bnRyeV9SZWdpb24sIERhdGUsIENvdW50LCAgUF9Db3VudCwgRGFpbHlfQ291bnQsIFBfRGFpbHlfQ291bnQsIFdlZWtseV9Db3VudCwgUF9XZWVrbHlfQ291bnQsIGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgKQ0KdG9wMTBfZGYgPC0gdG9wMTBfZGZbd2l0aCh0b3AxMF9kZiwgb3JkZXIoQ291bnRyeV9SZWdpb24sIERhdGUpKSwgXQ0KDQpgYGANCg0KYGBge3IgdG90YWxfcGxvdGx5LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0NCnRvcDEwX2RmX3dpZGVfcF9jb3VudCA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIFBfQ291bnQsIGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgKSAlPiUNCiAgc3ByZWFkKGtleT1Db3VudHJ5X1JlZ2lvbiwgdmFsdWU9UF9Db3VudCkNCg0KdG9wMTBfZGZfd2lkZV9jb3VudCA8LSB0b3AxMF9kZiAlPiUNCiAgZmlsdGVyKGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgICE9IDApICU+JQ0KICBzZWxlY3QoQ291bnRyeV9SZWdpb24sIENvdW50LCBgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCkgJT4lDQogIHNwcmVhZChrZXk9Q291bnRyeV9SZWdpb24sIHZhbHVlPUNvdW50KQ0KDQoNCnBhbGV0dGUgPC0gZGlzdGluY3RDb2xvclBhbGV0dGUoMjApDQoNCmZpZyA8LSB0b3AxMF9kZl93aWRlX2NvdW50ICU+JSBwbG90X2x5KCkNCg0KZm9yIChrIGluIDI6bGVuZ3RoKHRvcF8xMF9jb3VudHJpZXMpKSB7DQogIGNvdW50cnlfZGYgPC0gZGF0YS5mcmFtZSh5PXRvcDEwX2RmX3dpZGVfY291bnRbW2tdXSwgeD10b3AxMF9kZl93aWRlX2NvdW50W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPWNvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX2NvdW50KVtrXSwgdmlzaWJsZSA9IEYsIGNvbG9yID0gcGFsZXR0ZVtrXSkNCiAgDQogIHBfY291bnRyeV9kZiA8LSBkYXRhLmZyYW1lKHk9dG9wMTBfZGZfd2lkZV9wX2NvdW50W1trXV0sIHg9dG9wMTBfZGZfd2lkZV9wX2NvdW50W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPXBfY291bnRyeV9kZiwgdHlwZT0ic2NhdHRlciIsIG1vZGU9ImxpbmVzIiwgbmFtZSA9IGNvbG5hbWVzKHRvcDEwX2RmX3dpZGVfcF9jb3VudClba10sIGNvbG9yID0gcGFsZXR0ZVtrXSkNCn0NCg0KZmlnIDwtIGZpZyAlPiUgbGF5b3V0KA0KICAgIHRpdGxlID0gIlRvdGFsIENvbmZpcm1lZCBDYXNlcyBTaW5jZSBGaXJzdCAyNSBDYXNlcyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlPSdEYXlzIFNpbmNlIEZpcnN0IDI1IENhc2VzJyksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlRvdGFsIENvdW50ICglIG9yICMpIiksDQogICAgdXBkYXRlbWVudXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeSA9IDAuOCwNCiAgICAgICAgYnV0dG9ucyA9IGxpc3QoDQoNCiAgICAgICAgICBsaXN0KG1ldGhvZCA9ICJyZXN0eWxlIiwNCiAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KCJ2aXNpYmxlIiwgYyhyZXAobGlzdChGQUxTRSwgVFJVRSksIDE1KSkpLA0KICAgICAgICAgICAgICAgbGFiZWwgPSAiUGVyY2VudCBDb3VudCIpLA0KDQogICAgICAgICAgbGlzdChtZXRob2QgPSAicmVzdHlsZSIsDQogICAgICAgICAgICAgICBhcmdzID0gbGlzdCgidmlzaWJsZSIsIGMocmVwKGxpc3QoVFJVRSwgRkFMU0UpLCAxNSkpKSwNCiAgICAgICAgICAgICAgIGxhYmVsID0gIlRvdGFsIENvdW50IikNCiAgICAgICAgKQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KDQpmaWcNCmBgYA0KDQpgYGB7ciB3ZWVrbHlfcGxvdGx5LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0NCnRvcDEwX2RmX3dpZGVfcF93ZWVrbHkgPC0gdG9wMTBfZGYgJT4lDQogIGZpbHRlcihgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCAhPSAwKSAlPiUNCiAgc2VsZWN0KENvdW50cnlfUmVnaW9uLCBQX1dlZWtseV9Db3VudCwgYERheXMgU2luY2UgRmlyc3QgQ2FzZWApICU+JQ0KICBzcHJlYWQoa2V5PUNvdW50cnlfUmVnaW9uLCB2YWx1ZT1QX1dlZWtseV9Db3VudCkNCg0KdG9wMTBfZGZfd2lkZV93ZWVrbHkgPC0gdG9wMTBfZGYgJT4lDQogIGZpbHRlcihgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCAhPSAwKSAlPiUNCiAgc2VsZWN0KENvdW50cnlfUmVnaW9uLCBXZWVrbHlfQ291bnQsIGBEYXlzIFNpbmNlIEZpcnN0IENhc2VgKSAlPiUNCiAgc3ByZWFkKGtleT1Db3VudHJ5X1JlZ2lvbiwgdmFsdWU9V2Vla2x5X0NvdW50KQ0KDQoNCnBhbGV0dGUgPC0gZGlzdGluY3RDb2xvclBhbGV0dGUoMjApDQoNCmZpZyA8LSB0b3AxMF9kZl93aWRlX3dlZWtseSAlPiUgcGxvdF9seSgpDQoNCmZvciAoayBpbiAyOmxlbmd0aCh0b3BfMTBfY291bnRyaWVzKSkgew0KICBjb3VudHJ5X2RmIDwtIGRhdGEuZnJhbWUoeT10b3AxMF9kZl93aWRlX3dlZWtseVtba11dLCB4PXRvcDEwX2RmX3dpZGVfd2Vla2x5W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPWNvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX3dlZWtseSlba10sIHZpc2libGUgPSBGLCBjb2xvciA9IHBhbGV0dGVba10pDQogIA0KICBwX2NvdW50cnlfZGYgPC0gZGF0YS5mcmFtZSh5PXRvcDEwX2RmX3dpZGVfcF93ZWVrbHlbW2tdXSwgeD10b3AxMF9kZl93aWRlX3Bfd2Vla2x5W1sxXV0pDQogIGZpZyA8LSBhZGRfdHJhY2UoZmlnLCB5PX55LCB4PX54LCBkYXRhPXBfY291bnRyeV9kZiwgdHlwZT0ic2NhdHRlciIsIG1vZGU9ImxpbmVzIiwgbmFtZSA9IGNvbG5hbWVzKHRvcDEwX2RmX3dpZGVfcF93ZWVrbHkpW2tdLCBjb2xvciA9IHBhbGV0dGVba10pDQp9DQoNCmZpZyA8LSBmaWcgJT4lIGxheW91dCgNCiAgICB0aXRsZSA9ICJXZWVrbHkgQ29uZmlybWVkIENhc2VzIFNpbmNlIEZpcnN0IDI1IENhc2VzIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGU9J0RheXMgU2luY2UgRmlyc3QgMjUgQ2FzZXMnKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiV2Vla2x5IENvdW50ICglIG9yICMpIiksDQogICAgdXBkYXRlbWVudXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeSA9IDAuOCwNCiAgICAgICAgYnV0dG9ucyA9IGxpc3QoDQoNCiAgICAgICAgICBsaXN0KG1ldGhvZCA9ICJyZXN0eWxlIiwNCiAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KCJ2aXNpYmxlIiwgYyhyZXAobGlzdChGQUxTRSwgVFJVRSksIDE1KSkpLA0KICAgICAgICAgICAgICAgbGFiZWwgPSAiUGVyY2VudCBDb3VudCIpLA0KDQogICAgICAgICAgbGlzdChtZXRob2QgPSAicmVzdHlsZSIsDQogICAgICAgICAgICAgICBhcmdzID0gbGlzdCgidmlzaWJsZSIsIGMocmVwKGxpc3QoVFJVRSwgRkFMU0UpLCAxNSkpKSwNCiAgICAgICAgICAgICAgIGxhYmVsID0gIlRvdGFsIENvdW50IikNCiAgICAgICAgKQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KDQpmaWcNCmBgYA0KDQoNCg0KYGBge3IgZGFpbHlfcGxvdGx5LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0gIA0KDQp0b3AxMF9kZl93aWRlX3BfZGFpbHkgPC0gdG9wMTBfZGYgJT4lDQogIGZpbHRlcihgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCAhPSAwKSAlPiUNCiAgc2VsZWN0KENvdW50cnlfUmVnaW9uLCBQX0RhaWx5X0NvdW50LCBgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCkgJT4lDQogIHNwcmVhZChrZXk9Q291bnRyeV9SZWdpb24sIHZhbHVlPVBfRGFpbHlfQ291bnQpDQoNCnRvcDEwX2RmX3dpZGVfZGFpbHkgPC0gdG9wMTBfZGYgJT4lDQogIGZpbHRlcihgRGF5cyBTaW5jZSBGaXJzdCBDYXNlYCAhPSAwKSAlPiUNCiAgc2VsZWN0KENvdW50cnlfUmVnaW9uLCBEYWlseV9Db3VudCwgYERheXMgU2luY2UgRmlyc3QgQ2FzZWApICU+JQ0KICBzcHJlYWQoa2V5PUNvdW50cnlfUmVnaW9uLCB2YWx1ZT1EYWlseV9Db3VudCkNCg0KDQpwYWxldHRlIDwtIGRpc3RpbmN0Q29sb3JQYWxldHRlKDIwKQ0KDQpmaWcgPC0gdG9wMTBfZGZfd2lkZV9kYWlseSAlPiUgcGxvdF9seSgpDQoNCmZvciAoayBpbiAyOmxlbmd0aCh0b3BfMTBfY291bnRyaWVzKSkgew0KICBjb3VudHJ5X2RmIDwtIGRhdGEuZnJhbWUoeT10b3AxMF9kZl93aWRlX2RhaWx5W1trXV0sIHg9dG9wMTBfZGZfd2lkZV9kYWlseVtbMV1dKQ0KICBmaWcgPC0gYWRkX3RyYWNlKGZpZywgeT1+eSwgeD1+eCwgZGF0YT1jb3VudHJ5X2RmLCB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibGluZXMiLCBuYW1lID0gY29sbmFtZXModG9wMTBfZGZfd2lkZV9kYWlseSlba10sIHZpc2libGUgPSBGLCBjb2xvciA9IHBhbGV0dGVba10pDQogIA0KICBwX2NvdW50cnlfZGYgPC0gZGF0YS5mcmFtZSh5PXRvcDEwX2RmX3dpZGVfcF9kYWlseVtba11dLCB4PXRvcDEwX2RmX3dpZGVfcF9kYWlseVtbMV1dKQ0KICBmaWcgPC0gYWRkX3RyYWNlKGZpZywgeT1+eSwgeD1+eCwgZGF0YT1wX2NvdW50cnlfZGYsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsIG5hbWUgPSBjb2xuYW1lcyh0b3AxMF9kZl93aWRlX3BfZGFpbHkpW2tdLCBjb2xvciA9IHBhbGV0dGVba10pDQp9DQoNCmZpZyA8LSBmaWcgJT4lIGxheW91dCgNCiAgICB0aXRsZSA9ICJEYWlseSBDb25maXJtZWQgQ2FzZXMgU2luY2UgRmlyc3QgMjUgQ2FzZXMiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZT0nRGF5cyBTaW5jZSBGaXJzdCAyNSBDYXNlcycpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJEYWlseSBDb3VudCAoJSBvciAjKSIpLA0KICAgIHVwZGF0ZW1lbnVzID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHkgPSAwLjgsDQogICAgICAgIGJ1dHRvbnMgPSBsaXN0KA0KDQogICAgICAgICAgbGlzdChtZXRob2QgPSAicmVzdHlsZSIsDQogICAgICAgICAgICAgICBhcmdzID0gbGlzdCgidmlzaWJsZSIsIGMocmVwKGxpc3QoRkFMU0UsIFRSVUUpLCAxNSkpKSwNCiAgICAgICAgICAgICAgIGxhYmVsID0gIlBlcmNlbnQgQ291bnQiKSwNCg0KICAgICAgICAgIGxpc3QobWV0aG9kID0gInJlc3R5bGUiLA0KICAgICAgICAgICAgICAgYXJncyA9IGxpc3QoInZpc2libGUiLCBjKHJlcChsaXN0KFRSVUUsIEZBTFNFKSwgMTUpKSksDQogICAgICAgICAgICAgICBsYWJlbCA9ICJUb3RhbCBDb3VudCIpDQogICAgICAgICkNCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCg0KZmlnDQpgYGANCg0KIyMjIENPVklEMTkgQ2FzZXMgU3ByZWFkIFRpbWVsYXBzZQ0KDQpUaGUgdGltZS1sYXBzZSB3YXMgcHJvZHVjZWQgdGhyb3VnaCBnZ2FuaW1hdGUgYW5kIHNob3dzIHRoZSBzcHJlYWQgb2YgdGhlIHZpcnVzIHNpbmNlIDIySmFuMjAyMC4gVGhlIHRpbWUtbGFwc2UgY3ljbGVzIHRocm91Z2ggdGhlIGRhdGVzLCBzaG93aW5nIHRoZSBjb2xvciBjb2RlZCBpbmNyZWFzZSBvZiBjb25maXJtZWQsIHJlY292ZXJlZCwgYW5kIGRlYXRoIGNhc2VzIGFjcm9zcyB0aGUgd29ybGQuDQoNCmBgYHtyIHRpbWVsYXBzX2Nhc2VzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGluY2x1ZGU9RkFMU0V9DQpwIDwtIGdncGxvdCgpICsNCiAgYm9yZGVycygid29ybGQiLCBjb2xvdXIgPSAid2hpdGUiLCBmaWxsID0gImdyYXk4NSIpICsNCiAgY29vcmRfbWFwKHhsaW0gPSBjKC0xODAsIDE4MCksIHlsaW0gPSBjKC01NSwgNzApKSArDQogIHRoZW1lX21hcCgpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGN2LCBEYXRlPD1sYXRlc3RfZGF0ZSksIGFlcyh4ID0gTG9uZywgeSA9IExhdCwgc2l6ZSA9IGxvZzIoQ291bnQpLCBjb2xvciA9IFN0YXR1cyksIGFscGhhID0gMC4yNSkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDE1KSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSkgKw0KICBsYWJzKHRpdGxlID0gIkNPVklEMTkgTG9nIENvdW50IG9mIENhc2VzIChEYXRlOiB7ZnJhbWVfdGltZX0pIiwgc2l6ZSA9ICJMb2coQ2FzZXMpIikgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPTI1LCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcsIGZhY2UgPSAiYm9sZCIpDQogICkgKw0KICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gNSkpLCBzaXplID0gIm5vbmUiKSArDQogIHRyYW5zaXRpb25fdGltZShEYXRlKSArDQogIGVudGVyX2ZhZGUoKSArDQogIGV4aXRfZmFkZSgpICsNCiAgZWFzZV9hZXMoImxpbmVhciIpDQoNCmRheXMgPSBhcy5udW1lcmljKGxhdGVzdF9kYXRlIC0gYXMuRGF0ZSgiMjAyMC0wMS0yMiIpKQ0KDQphbmltX3NhdmUoImNvdmlkMTlfdGltZWxhcHNlLmdpZiIsIHAsIGhlaWdodCA9IDYwMCwgd2lkdGggPSAxMDAwLCBmcHMgPSAxMCwgbmZyYW1lcyA9IGRheXMqMiwgZW5kX3BhdXNlID0gMzApDQpgYGANCiFbXShjb3ZpZDE5X3RpbWVsYXBzZS5naWYpDQoNCiMjIyBOZXcgQ2FzZXMgb2YgdGhlIERheSAoYHIgbGF0ZXN0X2RhdGVgKQ0KDQpUaGUgJ05ldyBDYXNlcyBvZiB0aGUgRGF5JyBtYXAgZGlzcGxheXMgYWxsIGNvbmZpcm1lZCBjYXNlcyBvZiB0aGUgc3BlY2lmaWVkIGRhdGUuIFRoZSBtYXAgd2FzIHByb2R1Y2VkIHRocm91Z2ggTGVhZmxldCBhbmQgcHJvdmlkZXMgYSBkZXRhaWxlZCBhbmQgaW50ZXJhY3RpdmUgbWFwIHRoYXQgc2hvd3MgdGhlIGxvY2F0aW9uIGFuZCBudW1iZXIgb2YgY2FzZXMgb2YgdGhlIGRheS4NCg0KQWxzbywgdG8gZGlmZmVyZW50aWF0ZSBpZiB0aGUgY2FzZSBvZiB0aGUgZGF5IGlzIHRoZSBmaXJzdCBjYXNlIGluIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIGl0IGlzIGhpZ2hsaWdodGVkIHJlZC4gQWxsIHRoZSBzcGVjaWZpZWQgcG9pbnRzIG9uIHRoZSBtYXAgYXJlIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3csIGluY2x1ZGluZyBjdW11bGF0aXZlIGNvdW50IG9mIGVhY2ggbG9jYXRpb24uDQoNCg0KYGBge3IgZGF5X2xlYWZseV9wbG90LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZmlyc3RfY29sb3IgPC0gY29sb3JGYWN0b3IocGFsZXR0ZSA9IGMoInJlZCIsICJibHVlIiksIGxldmVscyA9IGMoVFJVRSwgRkFMU0UpKQ0KDQpuZXdfZGF5X2xhYmVscyA8LSBmdW5jdGlvbihkZikgew0KICBsYWJzIDwtIGxhcHBseShzZXEobnJvdyhkZikpLCBmdW5jdGlvbihpKSB7DQogICAgcGFzdGUwKA0KICAgICAgIkNvdW50cnk6ICIsIGRmW2ksICJDb3VudHJ5X1JlZ2lvbiJdLCAiPGJyPiAiLA0KICAgICAgIlByb3ZpbmNlOiAiLCBkZltpLCAiUHJvdmluY2VfU3RhdGUiXSwgIjxicj4iLA0KICAgICAgIkRheSBDb3VudDogIiwgZGZbaSwgIkRhaWx5X0NvdW50Il0sICI8YnI+IiwNCiAgICAgICJGaXJzdCBDYXNlOiAiLCBkZltpLCAiRmlyc3RfQ2FzZSJdLCAiPGJyPiIsDQogICAgICAiRGF0ZTogIiwgZGZbaSwgIkRhdGUiXQ0KICAgICkNCiAgfSkNCn0NCg0KbGVhZmxldChkYXRhID0gbmV3X2Nhc2VzX2RheSwgd2lkdGggPSAiMTAwJSIpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKA0KICAgIGxhdCA9IH5MYXQsDQogICAgbG5nID0gfkxvbmcsDQogICAgcmFkaXVzID0gfiBsb2coQ291bnQpIC8gMS4yNSwNCiAgICBsYWJlbCA9IGxhcHBseShuZXdfZGF5X2xhYmVscyhuZXdfY2FzZXNfZGF5KSwgaHRtbHRvb2xzOjpIVE1MKSwNCiAgICBjb2xvciA9IH4gZmlyc3RfY29sb3IoRmlyc3RfQ2FzZSkNCiAgKSAlPiUNCiAgYWRkTGVnZW5kKCJib3R0b21yaWdodCIsDQogICAgcGFsID0gZmlyc3RfY29sb3IsIHZhbHVlcyA9IH5GaXJzdF9DYXNlLA0KICAgIHRpdGxlID0gIkZpcnN0IENhc2UgKERheSkiLA0KICAgIG9wYWNpdHkgPSAwLjc1DQogICkNCmBgYA0KDQpgYGB7ciBkYXlfdGFibGVfbmV3LCBlY2hvPUZBTFNFfQ0KZGZfbmV3X2Nhc2VzX2RheSA8LSBuZXdfY2FzZXNfZGF5ICU+JQ0KICBzZWxlY3QoDQogICAgRGF0ZSwgQ291bnRyeV9SZWdpb24sIFByb3ZpbmNlX1N0YXRlLA0KICAgIENvdW50LCBEYWlseV9Db3VudCwgV2Vla2x5X0NvdW50LCBGaXJzdF9DYXNlDQogICkNCmRmX25ld19jYXNlc19kYXkNCmBgYA0KDQojIyMgTmV3IENhc2VzIG9mIHRoZSBXZWVrIChgciBsYXRlc3RfZGF0ZWApDQoNClRoZSAnTmV3IENhc2VzIG9mIHRoZSBXZWVrJyBtYXAgZGlzcGxheXMgYWxsIGNvbmZpcm1lZCBjYXNlcyBvZiB0aGUgd2VlayBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0ZS4gVGhpcyBtYXAgc2hvd3MgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIGRhaWx5IGNhc2VzIG1hcCBidXQgaW5jbHVkZXMgYWxsIGNhc2VzIGluIHRoZSBwYXN0IHdlZWsuDQoNCmBgYHtyIHdlZWtfbGVhZmx5X3Bsb3QsIGVjaG89RkFMU0V9DQpmaXJzdF9jb2xvciA8LSBjb2xvckZhY3RvcihwYWxldHRlID0gYygicmVkIiwgImJsdWUiKSwgbGV2ZWxzID0gYyhUUlVFLCBGQUxTRSkpDQoNCm5ld193ZWVrX2xhYmVscyA8LSBmdW5jdGlvbihkZikgew0KICBsYWJzIDwtIGxhcHBseShzZXEobnJvdyhkZikpLCBmdW5jdGlvbihpKSB7DQogICAgcGFzdGUwKA0KICAgICAgIkNvdW50cnk6ICIsIGRmW2ksICJDb3VudHJ5X1JlZ2lvbiJdLCAiPGJyPiAiLA0KICAgICAgIlByb3ZpbmNlOiAiLCBkZltpLCAiUHJvdmluY2VfU3RhdGUiXSwgIjxicj4iLA0KICAgICAgIldlZWsgQ291bnQ6ICIsIGRmW2ksICJXZWVrbHlfQ291bnQiXSwgIjxicj4iLA0KICAgICAgIkZpcnN0IENhc2U6ICIsIGRmW2ksICJGaXJzdF9DYXNlIl0sICI8YnI+IiwNCiAgICAgICJEYXRlOiAiLCBkZltpLCAiRGF0ZSJdDQogICAgKQ0KICB9KQ0KfQ0KDQpsZWFmbGV0KGRhdGEgPSBuZXdfY2FzZXNfd2Vlaywgd2lkdGggPSAiMTAwJSIpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKA0KICAgIGxhdCA9IH5MYXQsDQogICAgbG5nID0gfkxvbmcsDQogICAgcmFkaXVzID0gfiBsb2coQ291bnQpIC8gMS4yNSwNCiAgICBsYWJlbCA9IGxhcHBseShuZXdfd2Vla19sYWJlbHMobmV3X2Nhc2VzX3dlZWspLCBodG1sdG9vbHM6OkhUTUwpLA0KICAgIGNvbG9yID0gfiBmaXJzdF9jb2xvcihGaXJzdF9DYXNlKQ0KICApICU+JQ0KICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwNCiAgICBwYWwgPSBmaXJzdF9jb2xvciwgdmFsdWVzID0gfkZpcnN0X0Nhc2UsDQogICAgdGl0bGUgPSAiRmlyc3QgQ2FzZSAoV2VlaykiLA0KICAgIG9wYWNpdHkgPSAwLjc1DQogICkNCmBgYA0KDQpgYGB7ciB3ZWVrX3RhYmxlX25ldywgZWNobz1GQUxTRX0NCmRmX25ld19jYXNlc193ZWVrIDwtIG5ld19jYXNlc193ZWVrICU+JQ0KICBzZWxlY3QoDQogICAgRGF0ZSwgQ291bnRyeV9SZWdpb24sIFByb3ZpbmNlX1N0YXRlLA0KICAgIENvdW50LCBEYWlseV9Db3VudCwgV2Vla2x5X0NvdW50LCBGaXJzdF9DYXNlDQogICkNCmRmX25ld19jYXNlc193ZWVrDQpgYGANCg0KYGBge3IgY2FzZXNfY291bnRfcGVyY2VudF9hZ2csIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KcGVyY2VudF9jb3VudCA8LSBjdl9tZXJnZSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIGZpbHRlcihEYXRlIDw9IGxhdGVzdF9kYXRlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQsIG5hLnJtID0gVFJVRSksDQogICAgRGVhZCA9IHN1bShEZWFkLCBuYS5ybSA9IFRSVUUpLA0KICAgIFJlY292ZXJlZCA9IHN1bShSZWNvdmVyZWQsIG5hLnJtID0gVFJVRSkNCiAgKQ0KZm9yICh4IGluIHNlcSgxLCBucm93KHBlcmNlbnRfY291bnQpKSkgew0KICBpZiAoeCA9PSAxKSB7DQogICAgcGVyY2VudF9jb3VudCREYWlseV9Db25maXJtZWRbeF0gPC0gcGVyY2VudF9jb3VudCRDb25maXJtZWRbeF0NCiAgICBwZXJjZW50X2NvdW50JERhaWx5X0RlYWRbeF0gPC0gcGVyY2VudF9jb3VudCREZWFkW3hdDQogICAgcGVyY2VudF9jb3VudCREYWlseV9SZWNvdmVyZWRbeF0gPC0gcGVyY2VudF9jb3VudCRSZWNvdmVyZWRbeF0NCiAgfQ0KICBlbHNlIHsNCiAgICBwZXJjZW50X2NvdW50JERhaWx5X0NvbmZpcm1lZFt4XSA8LSBwZXJjZW50X2NvdW50JENvbmZpcm1lZFt4XSAtIHBlcmNlbnRfY291bnQkQ29uZmlybWVkW3ggLSAxXQ0KICAgIHBlcmNlbnRfY291bnQkRGFpbHlfRGVhZFt4XSA8LSBwZXJjZW50X2NvdW50JERlYWRbeF0gLSBwZXJjZW50X2NvdW50JERlYWRbeCAtIDFdDQogICAgcGVyY2VudF9jb3VudCREYWlseV9SZWNvdmVyZWRbeF0gPC0gcGVyY2VudF9jb3VudCRSZWNvdmVyZWRbeF0gLSBwZXJjZW50X2NvdW50JFJlY292ZXJlZFt4IC0gMV0NCiAgfQ0KfQ0KDQpkZWFkX2NvbmZfcmVjdiA8LSBwZXJjZW50X2NvdW50ICU+JQ0KICBzZWxlY3QoRGF0ZSwgQ29uZmlybWVkLCBEZWFkLCBSZWNvdmVyZWQpICU+JQ0KICBnYXRoZXIoa2V5PSJTdGF0dXMiLCB2YWx1ZT0iQ291bnQiLCAtRGF0ZSkNCg0KZGVhZF9jb25mX3JlY3ZfZGFpbHkgPC0gcGVyY2VudF9jb3VudCAlPiUNCiAgc2VsZWN0KERhdGUsIERhaWx5X0NvbmZpcm1lZCwgRGFpbHlfRGVhZCwgRGFpbHlfUmVjb3ZlcmVkKSAlPiUNCiAgZ2F0aGVyKGtleT0iRGFpbHkiLCB2YWx1ZT0iQ291bnQiLCAtRGF0ZSkNCg0KcGVyY2VudF9jb3VudCRQZXJjZW50X0RlYWQgPC0gcGVyY2VudF9jb3VudCREZWFkIC8gcGVyY2VudF9jb3VudCRDb25maXJtZWQNCg0KcGVyY2VudF9jb3VudCRQZXJjZW50X1JlY292ZXJlZCA8LSBwZXJjZW50X2NvdW50JFJlY292ZXJlZCAvIHBlcmNlbnRfY291bnQkQ29uZmlybWVkDQoNCnBlcmNlbnRfb3JnIDwtIHBlcmNlbnRfY291bnQgJT4lDQogIHNlbGVjdChEYXRlLCBQZXJjZW50X1JlY292ZXJlZCwgUGVyY2VudF9EZWFkKSAlPiUNCiAgZ2F0aGVyKGtleT0iU3RhdHVzIiwgdmFsdWU9IlBlcmNlbnQiLCAtRGF0ZSkgDQpgYGANCg0KIyMjIEdlbmVyYWwgVHJlbmRzDQoNClRoZSBwbG90cyBiZWxvdyBvdXRsaW5lcyBnZW5lcmFsIHRyZW5kcyBzZWVuIG9mIHRoZSB2aXJ1cyBvdmVyIHRpbWU6DQoNCigxKQnigJxQZXJjZW50IG9mIENhc2VzIFJlY292ZXJlZCBvciBEZWFkIHBlciBEYXnigJ06IHRoZSB0b3RhbCBwZXJjZW50IG9mIGNhc2VzIHRoYXQgaGF2ZSByZXN1bHRlZCBpbiByZWNvdmVyeSBvciBkZWF0aCBwZXIgY29uZmlybWVkIGNhc2UNCg0KKDIpCSJDdW11bGF0aXZlIFN0YXR1cyBvZiBBbGwgQ2FzZXMiOiB0aGUgY29udGludW91cyBpbmNyZWFzZSBvZiBjb25maXJtZWQsIGRlYXRoLCBhbmQgcmVjb3ZlcmVkIGNhc2VzIG92ZXIgdGltZSANCg0KKDMpCeKAnFN0YXR1cyBvZiBDYXNlcyBwZXIgRGF54oCdOiB0aGUgbnVtYmVyIG9mIGNhc2VzIGNsYXNzaWZpZWQgYXMgY29uZmlybWVkLCBkZWF0aCwgb3IgcmVjb3ZlcmVkIHN1YnRyYWN0ZWQgdG8gc2hvdyBwZXIgZGF5IGNoYW5nZXMNCg0KYGBge3IgcGxvdF9wZXJjZW50X2Nhc2VzLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00LjV9DQpnZ3Bsb3QocGVyY2VudF9vcmcsIGFlcyh4ID0gRGF0ZSwgeT1QZXJjZW50LCBncm91cD1TdGF0dXMpKSArDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBTdGF0dXMpLCBzaXplPTEuMykgKw0KICBnZ3RpdGxlKCJQZXJjZW50IG9mIENhc2VzIFJlY292ZXJlZCBvciBEZWFkIHBlciBEYXkiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQzIiwgImdyZWVuMyIpKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICI3IGRheSIsIA0KICAgICAgICAgICAgICAgZGF0ZV9taW5vcl9icmVha3MgPSAiNyBkYXkiLCANCiAgICAgICAgICAgICAgIGRhdGVfbGFiZWxzID0gIiViICVkIikgKw0KICB0aGVtZV9saWdodCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3IgcGxvdF9jdW11bGF0aXZlX3N0YXR1cywgZWNobz1GQUxTRSwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NC41fQ0KZ2dwbG90KGRlYWRfY29uZl9yZWN2LCBhZXMoeCA9IERhdGUsIHk9Q291bnQsIGdyb3VwPVN0YXR1cykpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFN0YXR1cyksIHNpemU9MS4zKSArDQogIGdndGl0bGUoIkN1bXVsYXRpdmUgU3RhdHVzIG9mIEFsbCBDYXNlcyIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUzIiwgInJlZDMiLCAiZ3JlZW4zIikpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjcgZGF5IiwgDQogICAgICAgICAgICAgICBkYXRlX21pbm9yX2JyZWFrcyA9ICI3IGRheSIsIA0KICAgICAgICAgICAgICAgZGF0ZV9sYWJlbHMgPSAiJWIgJWQiKSArDQogIHRoZW1lX2xpZ2h0KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQoNCmBgYHtyIHBsb3Rfc3RhdHVzX3Blcl9kYXksIGVjaG89RkFMU0UsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTQuNX0gIA0KZ2dwbG90KGRlYWRfY29uZl9yZWN2X2RhaWx5LCBhZXMoeCA9IERhdGUsIHk9Q291bnQsIGdyb3VwPURhaWx5KSkgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gRGFpbHkpLCBzaXplPTEuMykgKw0KICBnZ3RpdGxlKCJTdGF0dXMgb2YgQ2FzZXMgcGVyIERheSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUzIiwgInJlZDMiLCAiZ3JlZW4zIikpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjcgZGF5IiwgDQogICAgICAgICAgICAgICBkYXRlX21pbm9yX2JyZWFrcyA9ICI3IGRheSIsIA0KICAgICAgICAgICAgICAgZGF0ZV9sYWJlbHMgPSAiJWIgJWQiKSsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3IgZ2l0aHViX3B1c2hpbmdfY29tbWFuZHMsIGluY2x1ZGU9RkFMU0V9DQpnaXRzdGF0dXMgPC0gZnVuY3Rpb24oZGlyID0gZ2V0d2QoKSkgew0KICBjbWRfbGlzdCA8LSBsaXN0KA0KICAgIGNtZDEgPSB0b2xvd2VyKHN1YnN0cihkaXIsIDEsIDIpKSwNCiAgICBjbWQyID0gcGFzdGUoImNkIiwgZGlyKSwNCiAgICBjbWQzID0gImdpdCBzdGF0dXMiDQogICkNCiAgY21kIDwtIHBhc3RlKHVubGlzdChjbWRfbGlzdCksIGNvbGxhcHNlID0gIiAmICIpDQogIHNoZWxsKGNtZCkNCn0NCg0KZ2l0YWRkIDwtIGZ1bmN0aW9uKGRpciA9IGdldHdkKCkpIHsNCiAgY21kX2xpc3QgPC0gbGlzdCgNCiAgICBjbWQxID0gdG9sb3dlcihzdWJzdHIoZGlyLCAxLCAyKSksDQogICAgY21kMiA9IHBhc3RlKCJjZCIsIGRpciksDQogICAgY21kMyA9ICJnaXQgYWRkIC0tYWxsIg0KICApDQogIGNtZCA8LSBwYXN0ZSh1bmxpc3QoY21kX2xpc3QpLCBjb2xsYXBzZSA9ICIgJiAiKQ0KICBzaGVsbChjbWQpDQp9DQoNCmdpdGNvbW1pdCA8LSBmdW5jdGlvbihtc2cgPSBwYXN0ZSgiY2hvcmU6IGF1dG8tdXBkYXRlIiwgU3lzLnRpbWUoKSwgImVzdCIpLCBkaXIgPSBnZXR3ZCgpKSB7DQogIGNtZCA8LSBzcHJpbnRmKCJnaXQgY29tbWl0IC1tXCIlc1wiIiwgbXNnKQ0KICBzeXN0ZW0oY21kKQ0KfQ0KDQpnaXRwdXNoIDwtIGZ1bmN0aW9uKGRpciA9IGdldHdkKCkpIHsNCiAgY21kX2xpc3QgPC0gbGlzdCgNCiAgICBjbWQxID0gdG9sb3dlcihzdWJzdHIoZGlyLCAxLCAyKSksDQogICAgY21kMiA9IHBhc3RlKCJjZCIsIGRpciksDQogICAgY21kMyA9ICJnaXQgcHVzaCINCiAgKQ0KICBjbWQgPC0gcGFzdGUodW5saXN0KGNtZF9saXN0KSwgY29sbGFwc2UgPSAiICYgIikNCiAgc2hlbGwoY21kKQ0KfQ0KDQpnaXQycjo6Y29uZmlnKHVzZXIubmFtZSA9ICJhbGJlY2hlbiIsIHVzZXIuZW1haWwgPSAiYWxjaGVuMjQ0QGdtYWlsLmNvbSIpDQpgYGANCg0KYGBge3Igc2F2ZV9kb2MsIGluY2x1ZGU9RkFMU0V9DQpkb2N1bWVudFNhdmUoZ2V0QWN0aXZlRG9jdW1lbnRDb250ZXh0KCkpDQpTeXMuc2xlZXAoMjApDQpgYGANCg0KYGBge3IgZ2l0aHViX3B1c2hfYWxsLCBpbmNsdWRlPUZBTFNFfQ0KZ2l0c3RhdHVzKCkNCmdpdGFkZCgpDQpnaXRjb21taXQoKQ0KZ2l0cHVzaCgpDQpgYGANCg==